<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="generator" content="rustdoc">
    <title>Native Windows GUI guide - Derive controls</title>

    <link rel="stylesheet" type="text/css" href="style/rustbook.css">
    <link rel="stylesheet" type="text/css" href="style/pygments.css">
    <link rel="stylesheet" type="text/css" href="style/nwg.css">


</head>
<body class="rustdoc">
<!--[if lte IE 8]>
<div class="warning">
    This old browser is unsupported and will most likely display funky
    things.
</div>
<![endif]-->

<!-- NAV BEGIN -->
<div id="nav">
    <button id="toggle-nav">
        <span class="sr-only">Toggle navigation</span>
        <span class="bar"></span>
        <span class="bar"></span>
        <span class="bar"></span>
    </button>
</div>

    
<div id='toc' class='mobile-hidden'>
<ul class='chapter'>
<li><a href='index.html'><b>1.</b> Introduction</a>
</li>
<li><a href='getting_started.html'><b>2.</b> Getting Started</a>
</li>

<li><a href="basics.html"><b>3.</b> Basics </a>
<ul class="section">
    <li><a href="controls.html"><b>3.1.</b> Controls </a></li>
    <li><a href="events.html"><b>3.2.</b> Events </a></li>
    <li><a href="helper.html"><b>3.3.</b> Helpers </a></li>
    <li><a href="small.html"><b>3.4.</b> Small application layout </a></li>
    <li><a href="limitations.html"><b>3.5.</b> Limitations </a></li>
    <li><a href="distribute.html"><b>3.6.</b> Distributing </a></li>
    <li><a href="features.html"><b>3.7.</b> Features </a></li>
</ul>
</li>

<li><a href="intermediate.html"><b>4.</b> Intermediate </a>
<ul class="section">
    <li><a href="layouts.html"><b>4.1.</b> Layouts </a></li>
    <li><a href="resources.html"><b>4.2.</b> Resources </a></li>
    <li><a href="dialogs.html"><b>4.3.</b> Dialogs </a></li>
    <li><a href="localization.html"><b>4.4.</b> Internationalization </a></li>
</ul>
</li>

<li><a href="advanced.html"><b>5.</b> Advanced </a>
<ul class="section">
    <li><a href="partial.html"><b>5.1.</b> Partials ui </a></li>
    <li><a href="dynamic_control.html"><b>5.2.</b> Dynamic control </a></li>
    <li><a href="dynamic_event.html"><b>5.3.</b> Dynamic events </a></li>
    <li><a href="multithreading.html"><b>5.4.</b> Multithreading </a></li>
</ul>
</li>

<li><a href="derive.html"><b>6.</b> Native-windows-derive </a>
<ul class="section">
    <li><a href="nwd_basics.html"><b>6.1.</b> Basics </a></li>
    <li><a href="nwd_controls.html"><b>6.1.</b> Controls </a></li>
    <li><a href="nwd_resources.html"><b>6.2.</b> Resources </a></li>
    <li><a href="nwd_events.html"><b>6.3.</b> Events </a></li>
    <li><a href="nwd_layouts.html"><b>6.4.</b> Layouts </a></li>
    <li><a href="nwd_partial.html"><b>6.5.</b> Partials </a></li>
</ul>
</li>

<li><a href="low.html"><b>7.</b> Low level stuff </a>
    <ul class="section">
        <li><a href="low_events.html"><b>7.1.</b> Raw event handling </a></li>
        <li><a href="extern_wrapping.html"><b>7.2.</b> Raw control handle </a></li>
    </ul>
</li>

</ul>
</div>
<!-- NAV END -->

<div id='page-wrapper'>
    <div id='page'>

        <h1 class="title">Native Windows Derive: Basics</h1>

        Natives Windows Derive (NWD) is a procedural macro that can be used to generate the NWG boilerplate code.
        The code generated by NWD will be as fast as hand written code because NWD do not take any assumptions about your code. 
        <br><br>

        The first thing to do is to add native-windows-derive to your Cargo dependencies:

<pre class="rust rust-example-rendered">[<span class="kw">dependencies</span>]
<span class="ident">native-windows-gui</span> = <span class="string"><span class="string">"</span>1.0.12<span class="string">"</span></span>
<span class="ident">native-windows-derive</span> = <span class="string"><span class="string">"</span>1.0.3<span class="string">"</span></span>
</pre>

        And then, in <code>main.rs</code> or <code>lib.rs</code> :

<pre class="rust rust-example-rendered">
<span class="kw">extern crate</span> <span class="ident">native_windows_gui</span> <span class="kw">as</span> <span class="ident">nwg</span>;
<span class="kw">extern crate</span> <span class="ident">native_windows_derive</span> <span class="kw">as</span> <span class="ident">nwd</span>;
<span class="kw">use</span> <span class="ident">nwd::NwgUi</span>;
</pre>

    NWD expects your code to use a struct-based data layout, the same that has been used through this guide. If you skipped 
    <a href="small.html">3.4 Small application layout</a>, you should go read it first.
    <br><br>

    <h3>Basic setup</h3> 

    With this out of the way, derive <code>NwgUi</code> from your GUI struct:

<div class="highlight"><pre style="width: auto;"><span></span><span class="cp">#[derive(NwgUi)]</span><span class="w"></span>
<span class="k">pub</span><span class="w"> </span><span class="k">struct</span> <span class="nc">BasicApp</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">    </span><span class="p">...</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</pre></div><br>

    This will implement the base of the <code>NativeUi</code> trait on a new Ui wrapper struct.<br> The new struct will be named <code>[StructName]Ui</code>,
    in this case: <code>BasicAppUi</code>.<br> This structure will be returned by the <code>BasicApp::build_ui</code> function. <br>
    The derive macro will also implement <code>Deref</code> for you.
    <br><br>

    And that's only the first step. NWD has no way to know which fields in your struct are controls, it doesn't how to initalize them, it doesn't know
    how to dispatch the events, etc.<br><br>

    In order to feed NWD this information, the GUI fields needs to be marked with the NWD attributes. The following sections will go over these.

    <br><br>
    <br><br>


    </div>
</div>

<script src="style/rustbook.js"></script>
</body>
</html>
